//
//  main.m
//  04-集合(二)
//
//  Created by dllo on 16/7/7.
//  Copyright © 2016年 daming. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "Contact.h"
#import "ContactManager.h"
int main(int argc, const char * argv[]) {
    // 1.字典
    // 存储键值对(key-Value)的集合类型
    // 字典中存储的数据没有顺序
    // 通过key值存储和查找value
    // 1> 初始化
    // initWithobjectsAndKeys:value, key, value, key, ....
    // 字典中只能存放对象类型(NSObject的子类都是对象类型)
    // 如果出现汉字, 代码提示失效
    NSDictionary *dic = [[NSDictionary alloc] initWithObjectsAndKeys:@"lisi", @"name", [NSNumber numberWithInt:18], @"age", nil];
    NSLog(@"%@", dic);
    // 2> 便利构造器
    NSDictionary *dictionary = [NSDictionary dictionaryWithObjectsAndKeys:@"lisi", @"name", [NSNumber numberWithInt:18], @"age", nil];
    // 3> 推荐使用字面量 字符串 @"" 数值对象类型 NSNumber @() 数组 @[] 字典 @{key: value, key: value};
    NSDictionary *dic1 = @{@"name": @"zhangsan",
                            @"age": @16};
    // 4> 取值
    // <1> 通过key取value
    NSString *str = [dic1 objectForKey:@"age"];
    // <2> 取出所有的key
    NSArray *arr = [dic allKeys];
    // <3> 取出所有的value
    NSArray *arr2 = [dictionary allValues];
    NSLog(@"%@", str);
    NSLog(@"%@", arr);
    NSLog(@"%@", arr2);
    // <4> count
    NSUInteger count = dictionary.count;
    NSLog(@"%ld", count);
    // <5> 通过一个数组, 取到对应数组的value
    NSArray *allValueArray = [dic objectsForKeys:arr notFoundMarker:[NSString class]];
    NSLog(@"%@", allValueArray);
    // <6> 通过一个对象, 查找所有value是这个对象的所有的key
    NSArray *arr3 = [dic allKeysForObject:@"lisi"];
    NSLog(@"%@", arr3);
    // <7> 语法糖取值 arr[下标] dictionary[key]
    NSLog(@"快速取值:%@", dic[@"name"]);
    
    
    // 可变字典 NSMutableDictionary
    // 1.初始化方式 与 不可变字典基本相同
    NSMutableDictionary *muDic = [NSMutableDictionary dictionaryWithObjectsAndKeys:@"zhangsan", @"name", @20, @"age", nil];
    // 字面量(不推荐使用字面量)
    NSMutableDictionary *mutableDic = [@{@20: @"age", @"dsfsd": @"name"} mutableCopy];
    // 2.取值 与不可变字典相同
    // 3.增 删 改
    // 1> 添加 修改 setObject:value forKey:key
    // 如果key存在, 会将之前的value覆盖
    // 如果key不存在, 添加到字典中
    // 注意: 字典中的key不要重复, 如果重复, 会以最后的value进行赋值
    [muDic setObject:@"QQ" forKey:@"name"];
    NSLog(@"%@", muDic);
    // 2> 删除
    // <1> 移除全部
    [mutableDic removeAllObjects];
    // <2> 根据key移除
    [muDic removeObjectForKey:@"name"];
    // <3> 根据包含key的数组移除
    [muDic removeObjectsForKeys:@[@"name", @"age"]];
    // 3> 语法糖 与setObject:forKey: 相同
    mutableDic[@"sex"] = @"male";
    NSLog(@"%@", mutableDic);
//    完成以下需求
//  需求：
//  1、定义联系人类Contact。实例变量：姓名(拼音，首字母大写)、性别、电话号码、住址、分组名称、年龄。方法：自定义初始化方法(姓名、电话号码)、显示联系人信息。
//  2、在main.m中定义字典，分组管理所有联系人。分组名为26个大写的英文字母。
//  3、可以添加联系人对象，如果姓名或电话号码为空，添加失败。添加联系人到匹配的分组。
//  4、删除某个分组的全部联系人。
    Contact *con0 = [[Contact alloc]initWithName:@"Ahua" phoneNumber:@"11dfsdf1"];
    Contact *con1 = [[Contact alloc]initWithName:@"Buna" phoneNumber:@"22dfds2"];
    Contact *con2 = [[Contact alloc]initWithName:@"Cdsf" phoneNumber:@"33dsfsdf3"];
    Contact *con3 = [[Contact alloc]initWithName:@"Ddfg" phoneNumber:@"4sdfsdf44"];
    Contact *con4 = [[Contact alloc]initWithName:@"Efdd" phoneNumber:@"55sdfsdf5"];
    con0.groupName = @"A";
    con1.groupName = @"B";
    con2.groupName = @"C";
    con3.groupName = @"D";
    con4.groupName = @"E";
    [con0 showContact];
    [con1 showContact];
    [con2 showContact];
    [con3 showContact];
    [con4 showContact];
    NSMutableDictionary *dicOfContact = [NSMutableDictionary dictionary];
//    // key: A~Z value: NSMutableArray
//    // 判断名字和手机号码是否为空
//    if (con0.name.length > 0 && con0.phonenumber.length > 0) {
//        // 都不是空值, 可以添加
//        // 通过联系人的分组名, 取到相应的分组数组
//        NSMutableArray *contactArr = [dicOfContact objectForKey:con0.groupName];
//        // 判断数组是否存在
//        if (contactArr == nil) {
//            // 数组不存在, 创建数组
//            contactArr = [NSMutableArray array];
//            [contactArr addObject:con0];
//            [dicOfContact setObject:contactArr forKey:con0.groupName];
//            // 数组存在, 直接添加
//        } else {
//            [contactArr addObject:con0];
//            [dicOfContact setObject:contactArr forKey:con0.groupName];
//        }
//        [dicOfContact setObject:[NSMutableArray array] forKey:con0.groupName];
//        NSLog(@"添加%@联系人成功!", con0.name);
//    // 否则 添加失败
//    } else {
//        NSLog(@"添加失败!");
//    }
    ContactManager *contactManager = [[ContactManager alloc] initWithDictionary:dicOfContact];
    [contactManager addContact:con0];
    [contactManager addContact:con1];
    [contactManager addContact:con2];
    [contactManager addContact:con3];
    [contactManager addContact:con4];
    NSLog(@"%@", contactManager.contactDictionary);
    // 快速的将整形转化为字符串
    [@10 description];
    
    // 2.集合
    // 不可变 NSSet  可变 NSMutableSet
    // 1> 初始化
    // 集合会删除掉重复的内容(互异性)
    // 要删除数组或者字典中重复的内容, 可以放入集合中
    NSSet *set = [[NSSet alloc]initWithObjects:@"zhangsan", @"lishi", @"wanger", nil];
    NSLog(@"%@", set);
    // 2> 构造器
    NSSet *setObject = [NSSet setWithObjects:@"zhangsan", @"lisi", @"wang", nil];
    // 3> 没有提供集合的字面量
    
    // 取值
    // 从集合中取出任意元素
    NSString *str2 = [setObject anyObject];
    NSLog(@"%@", str2);
    // count
    NSUInteger setCount = set.count;
    NSLog(@"%ld", setCount);
    // 集合去重 (删除掉数组中重复的元素)
    NSArray *repeatArray = @[@10, @20, @30, @100, @10, @10];
    NSLog(@"%@", repeatArray);
    NSSet *repeatSet = [NSSet setWithArray:repeatArray];
    repeatArray = repeatSet.allObjects;
    NSLog(@"%@", repeatArray);
    
    // 可变集合 NSMutableSet
    // 1> 初始化与不可变集合一样
    // 2> 取值 anyObject
    // 3> 可变集合 可变性
    //
    NSMutableSet *mutableSet = [NSMutableSet set];
    // 添加
    [mutableSet addObject:@"123"];
    // 删除
    [mutableSet removeObject:@"123"];
    [mutableSet removeAllObjects];
    
    return 0;
}
